前言
不知还有多大伙伴还在和我一起继续刷的…不过我也没有日更了,不过题还是要做的,哈哈
题目描述
给定一个字符串 s,找到 s中最长的回文子串。你可以假设 s 的最大长度为1000。
示例1
1 | 输入: "babad" |
示例2
1 | 输入: "cbbd" |
解题
对于这道题,最简单的方法就是暴力求解了。对于很多算法题,我想会暴力求解是最基本的能力,但也绝不能满足于暴力,而且很多题的暴力解法都是很类似的。
这道题与其他的暴力解法一样,外面两层for循环遍历找出所以子串,第三层循环用来判断该子串是否为回文串。
这种算法的时间复杂度为O(n3)。这里我就不给出代码了
优化策略
我们可以换一种思想,假如字符串为回文串,那么把这个字符串首尾两个字符去掉,剩下的子串也会是一个回文串。
基于这种想法,我们就可以这样做了:一个for循环遍历所有字符,单个字符也可以是一个回文串,然后向这个字符的两边各自添加一个字符。判断该字符串是否还是回文串。
例如a是一个回文串,向a的两边添加一个字符,假如添加的这两个字符相同的话,那么添加之后的字符串还是回文串,如果两个字符串不同的话,那么添加之后就不是字符串了,。继续遍历下一个字符。,,,,,
需要注意的地方
不过这里有一个需要注意的地方,我们上面是从单个字符的两边开始向两边拓展添加字符的,这种情况下,最终回文串字符个数是奇数的,例如aba,cabac。
但是回文串的字符个数也有可能是偶数的,例如bb,cbbc,那么对于这种情况,按照单个字符向两边拓展的话就会出问题,因此对于这种情况,我们要从s[i],s[i+1]两边开始拓展。
知道了思路,可以自己先动手试一下能不能写出来。
我做的代码去下:
1 | public String longestPalindrome(String s) { |
这种方法的时间复杂度为O(n2)。
不过我去看了官方的解答,那里貌似提供了一个更牛的解法链接,这个解法的时间复杂度为O(n)。假如你有兴趣的话,可以去研究下。
链接:https://articles.leetcode.com/longest-palindromic-substring-part-ii/